package auto.app.pdf;

import auto.app.util.MyHeaderFooter;
import auto.app.util.Watermark;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.draw.DottedLineSeparator;
import com.itextpdf.text.pdf.draw.LineSeparator;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.concurrent.atomic.AtomicReference;

/**
 * 生成pdf文件
 */
public class PdfReportTest {

    // 定义全局的字体静态变量
    private static Font titlefont;
    private static Font headfont;
    private static Font smallheadfont;
    private static Font newsmallheadfont;
    private static Font keyfont;
    private static Font textfont;
    // 最大宽度
    private static int maxWidth = 520;
    // 静态代码块
    static {
        try {
            // 不同字体（这里定义为同一种字体：包含不同字号、不同style）
            BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            titlefont = new Font(bfChinese, 24, Font.BOLD);
            headfont = new Font(bfChinese, 14, Font.BOLD);
            smallheadfont=new Font(bfChinese,12,Font.BOLD);
            newsmallheadfont=new Font(bfChinese,10,Font.BOLD);
            keyfont = new Font(bfChinese, 10, Font.BOLD);
            textfont = new Font(bfChinese, 10, Font.NORMAL);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public ByteArrayOutputStream  pdfReportExcult() throws Exception {

        try {
            // 1.新建document对象
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            Document document = new Document(PageSize.A4);// 建立一个Document对象
            PdfWriter writer = PdfWriter.getInstance(document, baos);
            writer.setStrictImageSequence(true);
            writer.setPageEvent(new Watermark("gateway"));// 水印
            writer.setPageEvent(new MyHeaderFooterNew());// 页眉/页脚

            // 3.打开文档
            document.open();
            document.addTitle("操作手册");// 标题
            document.addAuthor("yangsen199606@163.com");// 作者
            document.addSubject("数据网关操作手册");// 主题
            document.addKeywords("操作手册");// 关键字
            document.addCreator("杨森");// 创建者

            // 4.向文档中添加内容
            new PdfReportTest().generatePDF(document);
            // 5.关闭文档
            document.close();
            return baos;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    // 生成PDF文件
    public void generatePDF(Document document) throws Exception {

        // 段落
        Paragraph paragraph = creatAllTitel("数据网关操作手册");
        //编写目的标题 及锻炼
        Paragraph paragraphTitle = creatTitle("编写目的:");
        // 段落
        Paragraph paragraphnew = creatDuan("本文档为数据网关操作手册；操作手册的目的是为了方便用户快速了解和使用系统，描述系统所提供的各功能点,充分理解业务需求，并对使用过程中产生的疑问进行解答,最终满足客户使用需求。");

        //读者对象标题
        Paragraph paragraphDuZhe = creatTitle("读者对象:");
        //读者对象段落
        Paragraph creatDuan = creatDuan("本文档主要目标读者有：项目各级主管领导、产品经理、设计者、测试人员、业务人员。");

        // 表格
        PdfPTable tableBanben = createTable(new float[] { 40, 120, 40, 120});
        tableBanben.addCell(createCell("版本新修记录", headfont, Element.ALIGN_LEFT, 6, false));
        tableBanben.addCell(createCell("编写人", keyfont, Element.ALIGN_CENTER));
        tableBanben.addCell(createCell("日期", keyfont, Element.ALIGN_CENTER));
        tableBanben.addCell(createCell("版本号", keyfont, Element.ALIGN_CENTER));
        tableBanben.addCell(createCell("备注", keyfont, Element.ALIGN_CENTER));

        tableBanben.addCell(createCell("杨森", textfont));
        tableBanben.addCell(createCell("2023-01-09", textfont));
        tableBanben.addCell(createCell("V1.0", textfont));
        tableBanben.addCell(createCell("数据网关操作手册", textfont));

        tableBanben.addCell(createCell("杨森", textfont));
        tableBanben.addCell(createCell("2023-01-12", textfont));
        tableBanben.addCell(createCell("V1.1", textfont));
        tableBanben.addCell(createCell("数据网关操作手册", textfont));
        for (int i = 0; i <3 ; i++) {
            tableBanben.addCell(createCell(" ", textfont));
            tableBanben.addCell(createCell(" ", textfont));
            tableBanben.addCell(createCell(" ", textfont));
            tableBanben.addCell(createCell(" ", textfont));
        }


        // 直线
        Paragraph p1 = new Paragraph();
        p1.add(new Chunk(new LineSeparator()));

        // 点线
        Paragraph p2 = new Paragraph();
        p2.add(new Chunk(new DottedLineSeparator()));

        // 超链接
        Anchor anchor = new Anchor("baidu");
        anchor.setReference("www.baidu.com");

        // 定位
        Anchor gotoP = new Anchor("goto");
        gotoP.setReference("#top");
        /***
         * 以下都是操作手册文档 图片及描述
         */
        //网关看板
        Paragraph paragraphwangguan = creatTitle("网关看板:");
        Paragraph paragraph1 = creatDuan("网关看板:显示供应商数量、接口数量、未处理告警数量、上月对账数量、接口调用次数、告警数量、对外费用、对内费用");
        // 添加图片
        Image image = createImage("2023-01-09_115918.png");

        //告警管理
        Paragraph paragraphgaojing = creatTitle("告警管理:");
        Paragraph paragraph3 = creatThreeTitle("新增告警");
        Paragraph elements1 = creatDuan("告警名称:告警名称自定义填写.");
        Paragraph elements11 = creatDuan("告警级别:可供选项1.紧急 2.严重 3.一般，告警记录的级别根据设置的告警级别而来.");
        Paragraph elements12 = creatDuan("告警对象:1.供应商 2.外部接口,根据选择的告警对象的不同,将会影响到可选择的的触发规则.");
        Paragraph elements13 = creatDuan("触发规则:1.当告警对象为供应商时，触发规则可选合同有效期和余额;2.当告警对象为外部接口时，现触发规则仅支持接口调用时间.");
        Paragraph elements2 = creatDuan("触发条件:情况1：当告警对象为供应商，触发规则为合同有效期，触发条件选择采购方以及供应商，操作符以及输入天数。该告警则会通过该供应商的有效期与用户设置的天数进行对比；执行频率(1天1次);" +
                "情况2：当告警对象为供应商，触发规则为余额，触发条件选择采购方以及供应商，选择消耗量，操作符，以及对应的天数.该告警模式的将计算出在对应消耗量的下的平均每天消耗金额,且用【余额/平均每天消耗金额】计算出剩余时间与设置天数进行对比；执行频率(1天1次);" +
                "情况3:当告警对象为外部接口，触发规则为接口调用响应时间，触发条件选择供应商（扫描日志表中为该数据源的数据）,周期可选【10，30，60】控制该告警的执行频率，平均响应时间（操作符）,设置毫秒数，该告警会根据设置的周期执行，计算出对应数据源的响应时间 且与设置的时间进行对比；执行频率（根据设置的周期 10 30 60））;" +
                "情况4:当告警对象为外部接口,触发规则为接口调用次数，触发条件选择"
        );
        Paragraph elements = creatDuan("告警频率(情况1:当告警对象为供应商，触发规则为合同有效期或余额时,告警频率为 天/次,情况2：当告警对象为外部接口,触发规则为接口调用响应时间 告警频率为 分钟/次 ;此频率是控制的通知策略)");
        Image image1 = createImage("2023-01-09_121520.png");
        Image image2 = createImage("1673240471455.jpg");

        Paragraph creatThreeTitle = creatThreeTitle("通知策略新增:");
        Image image3 = createImage("1673241134421.jpg");
        Paragraph creatDuan1 = creatDuan("时间设置:工作时间（周一到周五 早9晚6），非工作时间(周末),自定义时间(自己设置)");
        Paragraph elements3 = creatDuan("通知方式:1邮件 2短信 必选一项");
        Paragraph elements4 = creatDuan("通知人可以从基础信息中获取（支持多选），也可以自定义（多选用,隔开）");
        Image image4 = createImage("1673241414554.jpg");

        Paragraph elements5 = creatThreeTitle("告警启用/停用:");
        Paragraph elements6 = creatDuan("停用告警（该告警将会不生效）启用告警（告警生效）");
        Image image5 = createImage("1673241958358.jpg");

        Paragraph elements7 = creatThreeTitle("告警编辑:");
        Paragraph elements8 = creatDuan("编辑功能与新增一致");
        Image image6 = createImage("1673242198650.jpg");
        Image image7 = createImage("1673242235937.jpg");

        Paragraph elements9 = creatThreeTitle("告警删除:");
        Paragraph elements10 = creatDuan("删除告警策略已经相关通知策略(停用状态下可以删除)");
        Image image8 = createImage("1673242363228.jpg");



        document.add(paragraph);
        document.add(creatAllTitelNew("项目建设方：重庆蕴明科技股份有限公司"));
        document.add(creatAllTitelNew("项目承建方：重庆蕴明科技股份有限公司"));
        document.add(creatAllTitelNew("2023年1月12日"));
        document.add(tableBanben);
        document.add(paragraphTitle);
        document.add(paragraphnew);
        document.add(creatTitle("系统定义:"));
        document.add(creatDuan("系统包含'网关看板'、'告警管理'、'供应商管理'、'接口管理'、'账号管理'、'批量查询'、'接口调用日志'、'接口统计分析'、'费用统计'等功能模块。"));
        document.add(paragraphDuZhe);
        document.add(creatDuan);
        document.add(creatTitle("参考文档:"));
        document.add(creatDuan("《数据网关原型图》"));
        document.add(p1);
        //网关看板
        document.add(paragraphwangguan);
        document.add(paragraph1);
        document.add(image);
        document.add(p1);

        //告警管理
        document.add(paragraphgaojing);
        document.add(paragraph3);
        document.add(elements1);
        document.add(elements2);
        document.add(elements);
        document.add(image1);
        document.add(image2);
        document.add(image3);
        document.add(creatThreeTitle);
        document.add(creatDuan1);
        document.add(elements3);
        document.add(elements4);
        document.add(image4);

        document.add(elements5);
        document.add(elements6);
        document.add(image5);

        document.add(elements7);
        document.add(elements8);
        document.add(image6);
        document.add(image7);

        document.add(elements9);
        document.add(elements10);
        document.add(image8);

        document.add(creatThreeTitle("告警记录:"));
        document.add(creatDuan("当满足告警策略的触发条件时,将会生成一条告警记录，需手工处理"));
        document.add(createImage("1673243438295.jpg"));
        document.add(p1);
        //供应商管理
        document.add(creatTitle("供应商管理:"));

        document.add(creatThreeTitle("采购方管理:"));
        document.add(createImage("1673243724944.jpg"));
        document.add(createImage("1673243856446.jpg"));

        document.add(creatThreeTitle("采购方管理-新增:"));
        document.add(creatDuan("采购方管理添加 不允许同名的采购方重复添加"));
        document.add(createImage("1673243673408.jpg"));

        document.add(creatThreeTitle("采购方管理-编辑:"));
        document.add(creatDuan("采购方管理编辑 不允许同名的采购方 排除当前数据"));
        document.add(createImage("1673244428014.jpg"));

        document.add(creatThreeTitle("采购方管理-删除:"));
        document.add(creatDuan("采购方绑定了供应商则不能删除"));
        document.add(createImage("1673243975724.jpg"));

        document.add(creatThreeTitle("供应商管理-新增:"));
        document.add(creatDuan("供应商名称：字段数据来自与数据网关与三方对接的服务"));
        document.add(creatDuan("合作方式：1.预付款 则预充值金额必填 2.后付款 预充值金额非必填"));
        document.add(creatDuan("合同到期时间: 计算有效期(今天到合同结束日期) 若今天大于合同结束日期 （有效期为0）新增时结束日期小于当前日期 给予提示"));
        document.add(creatDuan("预充值金额: 若金额不为0 则会影响预充值金额(总数) 和 余额（增加这次充值金额）"));
        document.add(creatDuan("采购方为采购方管理中的相关数据(相同采购方，相同供应商 只能有一条数据)"));
        document.add(creatDuan("账号信息 根据数据源动态变化"));
        document.add(createImage("1673244684876.jpg"));
        document.add(createImage("1673245176393.jpg"));
        document.add(createImage("1673245198266.jpg"));

        document.add(creatThreeTitle("供应商管理-编辑:"));
        document.add(creatDuan("供应商管理-编辑 与新增相关逻辑点一致"));
        document.add(createImage("1673246110459.jpg"));

        document.add(creatThreeTitle("供应商管理-启用/停用:"));
        document.add(creatDuan("供应商管理 停用则会停用该供应商下面对应的所有的供应商账号，且记录下来 这次停用 停用了哪些账号"));
        document.add(creatDuan("供应商管理 启用 1.若上次停用 存在记录 则会启用对应账号 2若该供应商下无账号 则直接启用"));
        document.add(createImage("1673245399089.jpg"));
        document.add(createImage("1673245418208.jpg"));
        document.add(createImage("1673245436136.jpg"));

        document.add(creatThreeTitle("供应商管理-续期:"));
        document.add(creatDuan("供应商管理 续期变更合同有效期时间 以及 充值金额（影响合同有效期 以及预充值金额[总额] 余额）"));
        document.add(creatDuan("且会在详情中添加一条对应的续期记录"));
        document.add(createImage("1673245632871.jpg"));
        document.add(createImage("1673245681353.jpg"));
        document.add(createImage("1673245954544.jpg"));

        document.add(creatThreeTitle("供应商管理-详情:"));
        document.add(creatDuan("详情：1 基本信息 显示该供应商相关信息"));
        document.add(creatDuan("详情：2 下辖接口 显示该数据源下所有对应的三方接口"));
        document.add(creatDuan("详情：3 续期记录 显示该供应商的续期记录"));
        document.add(createImage("1673246296969.jpg"));
        document.add(createImage("1673246323282.jpg"));
        document.add(createImage("1673246345858.jpg"));
        document.add(p1);

        //接口管理
        document.add(creatTitle("接口管理:"));
        document.add(creatDuan("接口管理与老板数据网关基本一致，详情中可以查看该接口的出参、入参 以及测试功能"));
        document.add(createImage("1673246557125.jpg"));
        document.add(createImage("1673246602110.jpg"));
        document.add(p1);

        //账号管理
        document.add(creatTitle("账号管理:"));

        document.add(creatThreeTitle("业务系统:"));
        document.add(createImage("3750c1d85d3b02f37f0cf1858e105bb.png"));
        document.add(createImage("f106afc2ed0cca8273e2ce528a7cfb0.png"));

        document.add(creatThreeTitle("业务系统-新增:"));
        document.add(creatDuan("业务系统添加 不允许同名的业务系统重复添加"));
        document.add(createImage("1673247431324.jpg"));

        document.add(creatThreeTitle("业务系统-编辑:"));
        document.add(creatDuan("业务系统编辑 不允许同名的业务系统 排除当前数据"));
        document.add(createImage("1673247453021.jpg"));

        document.add(creatThreeTitle("业务系统-删除:"));
        document.add(creatDuan("业务系统绑定了账号则不能删除"));
        document.add(createImage("1673247474485.jpg"));

        document.add(creatThreeTitle("账号管理-新增:"));
        document.add(creatDuan("申请部门：来自部门的基础数据"));
        document.add(creatDuan("业务系统：来自于业务系统管理"));
        document.add(creatDuan("采购方名称: 来自采购方管理"));
        document.add(creatDuan("供应商名称: 必须选择采购方后，才能自动筛选出该采购方下面的已经添加的供应商（若供应商无数据 则该采购未绑定供应商）"));
        document.add(creatDuan("项目名称: 项目名称唯一校验"));
        document.add(creatDuan("校验逻辑: 1.相同部门 业务系统 采购方 供应商的账号 只能存在一个 2.项目名称不能重复"));
        document.add(createImage("1673247724929.jpg"));
        document.add(createImage("1673247788746.jpg"));
        document.add(createImage("1673247833195.jpg"));

        document.add(creatThreeTitle("账号管理-修改:"));
        document.add(creatDuan("字段逻辑 与新增一致，只能当账号状态为禁用的时候才能修改"));
        document.add(creatDuan("校验逻辑: 1.相同部门 业务系统 采购方 供应商的账号 只能存在一个 2.项目名称不能重复"));
        document.add(createImage("1673247948936.jpg"));
        document.add(createImage("1673247963175.jpg"));

        document.add(creatThreeTitle("账号管理-删除:"));
        document.add(creatDuan("当账号状态为禁用时 可以删除账号"));
        document.add(createImage("1673248094442.jpg"));

        document.add(creatThreeTitle("账号管理-配置:"));
        document.add(creatDuan("当账号状态为禁用时 可以配置对应数据源下的接口的调用价格 以供费用统计相关业务"));
        document.add(createImage("1673248183473.jpg"));
        document.add(createImage("1673248203450.jpg"));

        document.add(creatThreeTitle("账号管理-启用/禁用:"));
        document.add(creatDuan("当账号状态为禁用时 可以删除/修改/配置 账号"));
        document.add(creatDuan("当账号状态为启用时 仅可以查看账号详情（接口配置信息）"));
        document.add(createImage("1673248336112.jpg"));
        document.add(p1);

        //批量查询
        document.add(creatTitle("批量查询:"));

        document.add(creatThreeTitle("批量查询-新增:"));
        document.add(creatDuan("查询描述: 可输入任意信息描述查询"));
        document.add(creatDuan("申请部门，业务系统，采购方，供应商是级联接口。第一步 选择申请部门 第二步 选择业务系统 第三步 选择采购方 第四步 选择供应商（申请部门，业务系统，采购方，供应商 对应的数据必须在账号管理中存在且启用否则下拉框中数据为空）"));
        document.add(creatDuan("接口根据数据源返回对应数据源下的所有接口"));
        document.add(creatDuan("下载模板: 根据供应商和接口名称获取模板 模板中包含数据的入参"));
        document.add(creatDuan("上次文件: 上传按对应格式准备好的json文件（格式很重要 不是后端无法调用）"));
        document.add(creatDuan("获取验证码:根据平台上用户的基础信息 拿到电话号码并发送短信 5分钟有效"));
        document.add(creatDuan("提交成功后 数据状态变为复核"));
        document.add(createImage("1673248957430.jpg"));

        document.add(creatThreeTitle("批量查询-复核:"));
        document.add(creatDuan("复核: 仅平台上配置了权限的用户 可以进行复核（其他用户无复核按钮）"));
        document.add(creatDuan("复核-同意: 后端进行异步调用执调用数据接口 全部成功后（状态变为成功）部分成功或者失败（状态变为部分失败）"));
        document.add(creatDuan("复核-驳回: 该数据状态变更为已驳回"));
        document.add(createImage("1673249333602.jpg"));
        document.add(createImage("1673249293691.jpg"));

        document.add(creatThreeTitle("批量查询-下载结果:"));
        document.add(creatDuan("当复核后，异步执行完成 可以下载结果"));
        document.add(creatDuan("结果以excle格式展示 分为成功 和失败 两个sheet"));
        document.add(createImage("1673249514770.jpg"));
        document.add(createImage("1673249605200.jpg"));
        document.add(p1);

        //接口调用日志
        document.add(creatTitle("接口调用日志:"));
        document.add(creatDuan("接口调用日志与老版本数据网关基本一致 仅供查询使用"));
        document.add(createImage("1673249791724.jpg"));
        document.add(p1);

        //接口统计分析
        document.add(creatTitle("接口统计分析:"));
        document.add(creatThreeTitle("接口调用次数统计:"));
        document.add(creatDuan("接口调用次数统计-定时任务 每个月1号凌晨3点 自动执行定时任务（生成上个月的相关数据-接口调用次数）"));
        document.add(creatDuan("失败次数：根据接口调用日志中该调用日志的状态来判断"));
        document.add(createImage("1673250039982.jpg"));
        document.add(createImage("1673250009599.jpg"));

        document.add(creatThreeTitle("接口调用分布统计-字段管理-新增:"));
        document.add(creatDuan("供应商名称:根据三方数据源服务来动态更新的"));
        document.add(creatDuan("接口:根据供应商动态获取该供应商下面的对应接口"));
        document.add(creatDuan("重要字段:根据供应商名称 和 接口 动态获取该接口的出参"));
        document.add(creatDuan("高风险:若选择的字段为字符串 类型包括(等于 包含 不包含) 若选择的字段为int类型 操作符 >= <= > < = （返回的字段 满足高风险的判断则高风险）"));
        document.add(creatDuan("缺失值:若返回的字符串中该字段等于缺失值则缺失 且 若未返回该字段也为缺失"));
        document.add(creatDuan("校验逻辑:若供应商名称 接口  重要字段 高风险 缺失值 等一样 不能重复添加"));
        document.add(createImage("1673250286791.jpg"));
        document.add(createImage("1673250298872.jpg"));
        document.add(createImage("1673250807037.jpg"));


        document.add(creatThreeTitle("接口调用分布统计-字段管理-编辑:"));
        document.add(creatDuan("编辑逻辑与新增逻辑一致"));
        document.add(createImage("1673250944784.jpg"));


        document.add(creatThreeTitle("接口调用分布统计-字段管理-删除:"));
        document.add(creatDuan("删除 无校验逻辑，直接删除"));
        document.add(createImage("1673250994298.jpg"));

        document.add(creatThreeTitle("接口调用分布统计"));
        document.add(creatDuan("每天凌晨2点 定时任务自动执行昨日的数据进行接口调用分布统计（根据字段管理中的数据 来进行生成接口调用分布统计）"));
        document.add(createImage("1673251136096.jpg"));
        document.add(createImage("1673251096392.jpg"));
        document.add(p1);

        //费用统计
        document.add(creatTitle("费用统计:"));
        document.add(creatThreeTitle("对外费用:"));
        document.add(creatDuan("每月1号1点 自动执行定时任务费用统计 生成对内、对外相关费用"));
        document.add(creatDuan("对账费用=系统计算费用+手工调整费用，且对账费用增加 对应供应商的余额就会减少,对账费用减少 对应供应商的余额就会增加"));
        document.add(creatDuan("手工调整费用可以为负数（下限为与系统计算费用相加不能小于0）"));
        document.add(creatDuan("对外费用 一共四层页面"));
        document.add(createImage("1673251720953.jpg"));
        document.add(createImage("1673251570006.jpg"));
        document.add(createImage("1673251570006.jpg"));
        document.add(createImage("1673251603608.jpg"));
        document.add(createImage("1673251621985.jpg"));
        document.add(createImage("1673251633259.jpg"));

        document.add(creatThreeTitle("对内费用:"));
        document.add(creatDuan("每月1号1点 自动执行定时任务费用统计 生成对内、对外相关费用"));
        document.add(creatDuan("对账费用=系统计算费用+手工调整费用，只会影响对账费用 不会影响余额"));
        document.add(creatDuan("对内费用 一共四层页面 与对外费用相同"));

    }
    //居中标题
    //创建段落
    public Paragraph creatAllTitel(String title){
        Paragraph paragraphnew = new Paragraph(title, titlefont);
        paragraphnew.setAlignment(1); //设置文字居中 0靠左   1，居中     2，靠右
        paragraphnew.setIndentationLeft(12); //设置左缩进
        paragraphnew.setIndentationRight(12); //设置右缩进
        paragraphnew.setFirstLineIndent(24); //设置首行缩进
        paragraphnew.setLeading(20f); //行间距
        paragraphnew.setSpacingBefore(100f); //设置段落上空白
        paragraphnew.setSpacingAfter(100f); //设置段落下空白
        return paragraphnew;
    }

    public Paragraph creatAllTitelNew(String title){
        Paragraph paragraphnew = new Paragraph(title, titlefont);
        paragraphnew.setAlignment(1); //设置文字居中 0靠左   1，居中     2，靠右
        paragraphnew.setIndentationLeft(12); //设置左缩进
        paragraphnew.setIndentationRight(12); //设置右缩进
        paragraphnew.setFirstLineIndent(24); //设置首行缩进
        paragraphnew.setLeading(20f); //行间距
        paragraphnew.setSpacingBefore(50f); //设置段落上空白
        paragraphnew.setSpacingAfter(20f); //设置段落下空白
        return paragraphnew;
    }

    //创建标题
    public Paragraph creatTitle(String name){
        Paragraph paragraphTitle = new Paragraph(name, headfont);
        paragraphTitle.setAlignment(0); //设置文字居中 0靠左   1，居中     2，靠右
        return paragraphTitle;
    }
    //创建二级标题
    public Paragraph creatTwoTitle(String name){
        Paragraph paragraphTitle = new Paragraph(name, smallheadfont);
        paragraphTitle.setAlignment(0); //设置文字居中 0靠左   1，居中     2，靠右
        return paragraphTitle;
    }

    //创建三级标题
    public Paragraph creatThreeTitle(String name){
        Paragraph paragraphTitle = new Paragraph(name, newsmallheadfont);
        paragraphTitle.setAlignment(0); //设置文字居中 0靠左   1，居中     2，靠右
        return paragraphTitle;
    }
    public Image createImage(String url) throws IOException, BadElementException {
        Image image = Image.getInstance("C:\\Users\\A\\Desktop\\img\\"+url);
        image.setAlignment(Image.ALIGN_CENTER);
        image.scalePercent(25); //依照比例缩放
        return image;
    }
    //创建段落
    public Paragraph creatDuan(String duanLuo){
        Paragraph paragraphnew = new Paragraph(duanLuo, textfont);
        paragraphnew.setAlignment(0); //设置文字居中 0靠左   1，居中     2，靠右
        paragraphnew.setIndentationLeft(12); //设置左缩进
        paragraphnew.setIndentationRight(12); //设置右缩进
        paragraphnew.setFirstLineIndent(24); //设置首行缩进
        paragraphnew.setLeading(20f); //行间距
        paragraphnew.setSpacingBefore(5f); //设置段落上空白
        paragraphnew.setSpacingAfter(10f); //设置段落下空白
        return paragraphnew;
    }


/**------------------------创建表格单元格的方法start----------------------------*/
    /**
     * 创建单元格(指定字体)
     * @param value
     * @param font
     * @return
     */
    public PdfPCell createCell(String value, Font font) {
        PdfPCell cell = new PdfPCell();
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setPhrase(new Phrase(value, font));
        return cell;
    }
    /**
     * 创建单元格（指定字体、水平..）
     * @param value
     * @param font
     * @param align
     * @return
     */
    public PdfPCell createCell(String value, Font font, int align) {
        PdfPCell cell = new PdfPCell();
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(align);
        cell.setPhrase(new Phrase(value, font));
        return cell;
    }
    /**
     * 创建单元格（指定字体、水平居..、单元格跨x列合并）
     * @param value
     * @param font
     * @param align
     * @param colspan
     * @return
     */
    public PdfPCell createCell(String value, Font font, int align, int colspan) {
        PdfPCell cell = new PdfPCell();
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(align);
        cell.setColspan(colspan);
        cell.setPhrase(new Phrase(value, font));
        return cell;
    }
    /**
     * 创建单元格（指定字体、水平居..、单元格跨x列合并、设置单元格内边距）
     * @param value
     * @param font
     * @param align
     * @param colspan
     * @param boderFlag
     * @return
     */
    public PdfPCell createCell(String value, Font font, int align, int colspan, boolean boderFlag) {
        PdfPCell cell = new PdfPCell();
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(align);
        cell.setColspan(colspan);
        cell.setPhrase(new Phrase(value, font));
        cell.setPadding(3.0f);
        if (!boderFlag) {
            cell.setBorder(0);
            cell.setPaddingTop(15.0f);
            cell.setPaddingBottom(8.0f);
        } else if (boderFlag) {
            cell.setBorder(0);
            cell.setPaddingTop(0.0f);
            cell.setPaddingBottom(15.0f);
        }
        return cell;
    }
    /**
     * 创建单元格（指定字体、水平..、边框宽度：0表示无边框、内边距）
     * @param value
     * @param font
     * @param align
     * @param borderWidth
     * @param paddingSize
     * @param flag
     * @return
     */
    public PdfPCell createCell(String value, Font font, int align, float[] borderWidth, float[] paddingSize, boolean flag) {
        PdfPCell cell = new PdfPCell();
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(align);
        cell.setPhrase(new Phrase(value, font));
        cell.setBorderWidthLeft(borderWidth[0]);
        cell.setBorderWidthRight(borderWidth[1]);
        cell.setBorderWidthTop(borderWidth[2]);
        cell.setBorderWidthBottom(borderWidth[3]);
        cell.setPaddingTop(paddingSize[0]);
        cell.setPaddingBottom(paddingSize[1]);
        if (flag) {
            cell.setColspan(2);
        }
        return cell;
    }
/**------------------------创建表格单元格的方法end----------------------------*/


/**--------------------------创建表格的方法start------------------- ---------*/
    /**
     * 创建默认列宽，指定列数、水平(居中、右、左)的表格
     * @param colNumber
     * @param align
     * @return
     */
    public PdfPTable createTable(int colNumber, int align) {
        PdfPTable table = new PdfPTable(colNumber);
        try {
            table.setTotalWidth(maxWidth);
            table.setLockedWidth(true);
            table.setHorizontalAlignment(align);
            table.getDefaultCell().setBorder(1);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return table;
    }
    /**
     * 创建指定列宽、列数的表格
     * @param widths
     * @return
     */
    public PdfPTable createTable(float[] widths) {
        PdfPTable table = new PdfPTable(widths);
        try {
            table.setTotalWidth(maxWidth);
            table.setLockedWidth(true);
            table.setHorizontalAlignment(Element.ALIGN_CENTER);
            table.getDefaultCell().setBorder(1);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return table;
    }
    /**
     * 创建空白的表格
     * @return
     */
    public PdfPTable createBlankTable() {
        PdfPTable table = new PdfPTable(1);
        table.getDefaultCell().setBorder(0);
        table.addCell(createCell("", keyfont));
        table.setSpacingAfter(20.0f);
        table.setSpacingBefore(20.0f);
        return table;
    }
}
